package thread_test;

import java.util.*;
import java.util.concurrent.CountDownLatch;

public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        // 1. 此处构造方法中写 10 代表有 10 个线程/任务
        CountDownLatch latch = new CountDownLatch(10);
        // 创建出 10 个线程负责下载
        for (int i = 0; i < 10; i++) {
            int id = i;
            Thread t = new Thread(()->{
                // 引入随机数模拟每个线程下载速度不一致
                Random random = new Random();
                int time = (random.nextInt(5) + 1) * 1000;
                System.out.println("线程 " + id + " 开始下载");
                try {
                    // 这里休眠模拟当前线程正在下载
                    Thread.sleep(time);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("线程 " + id + " 下载完成");
                // 2. 调用 countDown 方法告知 CountDownLatch 我下载完成了
                latch.countDown();
            });
            // 启动线程
            t.start();
        }
        // 3. 通过 await 方法来等待所有任务执行结束,也就是 countDown 方法被调用 10 次了
        latch.await();
        // 4. 此时任务就算已经下载完成了
        System.out.println("所有任务都下载完成");
    }
}
